<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>集合WeakSet</title>
		<script type="text/javascript">
			// WeakSet   /wiːk  set/
			
			
			// WeakSet 是一些对象值的集合, 并且其中的每个对象值都只能出现一次。在WeakSet的集合中是唯一的
			// 【注】WeakSet 的成员只能是对象，而不能是其他类型的值
			
			var myWeakSet = new WeakSet();
			var obj1 = {};
			var obj2 = {};
			var str1 = "123";
			
			myWeakSet.add(obj1);
			myWeakSet.add(obj2);
			// myWeakSet.add(str1);    //报错
			
			alert(myWeakSet.has(obj1));  //true
			alert(myWeakSet.has(obj2));  //true
			
			myWeakSet.delete(obj2);
			alert(myWeakSet.has(obj2));  //false
			
			
			/*
				这里有个概念------垃圾回收机制
				
				这个垃圾回收机制是针对对象的，在js中只有自动回收机制
				
				举个例子
				var obj1 = {
					a: 1,
					b: "123"
				}
				var obj2 = {
					c: 2,
					d: "321"
				}
				
				obj1在栈中存储的是指向堆中{a: 1, b: "123"}对象的地址(我们在下面称为地址1，对象1)，
				同理obj2在栈中存储的是指向堆中{c: 2, d: "321"}对象的地址(我们在下面称为地址2，，对象1)。
				
				obj1 = obj2；
				
				当进行上面的赋值操作后，obj1在栈中存储的是指向对象2的地址2，
				此时，对象1没有再被人引用，栈中也找不到指向对象1的地址1
				过一段时间对象1依然没人引用，则会被系统的垃圾回收机制处理掉
			*/
			
			
			/*
				1、与Set相比，WeakSet 只能是对象的集合，而不能是任何类型的任意值。
				2、WeakSet持弱引用：集合中对象的引用为弱引用。 如果没有其他的对WeakSet中对
				   象的引用，那么这些对象会被当成垃圾回收掉。 这也意味着WeakSet中没有存储当
				   前对象的列表。 正因为这样，WeakSet 是不可枚举的。
			*/
			
		</script>
	</head>
	<body>
	</body>
</html>
